﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Npgsql;


namespace Golfvision2020
{
    public partial class Bokning : Form
    {

        // Vi tar in förälder-formen så att vi kan komma åt databaskopplingen
        public Golfvision Klubben;

        public Bokning(Golfvision golfklubben)
        {
            Klubben = golfklubben;
            InitializeComponent();
            GetNamnFromDB(); //Hämtar spelare från databasen och lägger in de i rullgardinen
            GetTidFromDB(); //Hämtar speltider från databasen och lägger in de i rullgardinen
            KollaBehörighet(); //Kontrollerar behörighet för att få använda formuläret
        }

        private void KollaBehörighet() //Kontrollerar behörighet för formuläret
        {
            if (Klubben.Admin == false)
            {
                NameCombobox.Enabled = false;
                efterNamn.Enabled = false;
                IDCombobox.Select();
                IDCombobox.Text = Klubben.Golf_id;
                IDCombobox.Enabled = false;
            }
        }

        public void GetTidFromDB() //Hämtar lediga tider från databasen, dvs. de som inte har 4 bokningar och de tider som inte är bokade av banpersonal
        {
            NpgsqlCommand command = new NpgsqlCommand("SELECT tid_var.tid FROM tid tid_var WHERE(SELECT COUNT(bokning.tid_id) from bokning,tid WHERE bokning.tid_id=tid.tid_id AND tid_var.tid=tid.tid AND speldatum = @datum)<4 AND tid <> ALL (SELECT tid FROM tid, bokning WHERE bokning.tid_id = tid.tid_id AND golf_id = 16 AND speldatum = @datum) ORDER BY tid_var.tid;", Klubben.conn);
            command.Parameters.AddWithValue("@datum", this.PickDateCalendar.SelectionStart);
            command.Parameters.AddWithValue("@banarbetare", 16);
            NpgsqlDataReader dr = command.ExecuteReader();
            while (dr.Read())
            {
                tidVal.Items.Add(dr["tid"].ToString().Substring(11));
            }
            dr.Close();
        }

        public void GetNamnFromDB() //Hämtar alla spelare från databasen och lägger in de i rullgardinen
        {
            NpgsqlCommand command = new NpgsqlCommand("SELECT first_name, last_name, golf_id FROM spelare", Klubben.conn);
            NpgsqlDataReader dr = command.ExecuteReader();
            while (dr.Read())
            {
                NameCombobox.Items.Add(dr["first_name"].ToString());
                efterNamn.Items.Add(dr["last_name"].ToString());
                IDCombobox.Items.Add(dr["golf_id"].ToString());
            }
            dr.Close();
        }

              
        private void RegBokningButton_Click(object sender, EventArgs e) //Vid knapptryck registreras en bokning
        {
            // Kolla att inte bokningen ligger på en tävling
            String check_tavl_sql = String.Format(@"
                SELECT namn, spelstart, spelslut FROM tavling 
                WHERE to_timestamp('{0}', 'YYYY-MM-DD HH24:MI:SS') > spelstart 
                AND to_timestamp('{0}', 'YYYY-MM-DD HH24:MI:SS') < spelslut",
                this.PickDateCalendar.SelectionStart.ToString("yyyy-MM-dd") + " " + this.tidVal.SelectedItem.ToString());
            NpgsqlCommand cmd = new NpgsqlCommand(check_tavl_sql, Klubben.conn);
            
            NpgsqlDataReader dr = cmd.ExecuteReader();
            while(dr.Read()) // Kolla om det finns en eller flera tävlingar under bokningstiden
            {
                MessageBox.Show("Tävlingen " + dr["namn"].ToString() + " finns bokad på denna tid mellan\n " +
                                dr["spelstart"].ToString() + " och " + dr["spelslut"].ToString());
                dr.Close();
                return;
            }
            dr.Close();


            String tidId = AddTidId();
            String Datum = DateTime.Now.ToString("yyyy-MM-dd");

            string sql = "INSERT INTO bokning( "
                + "golf_id, speldatum, tid_id, registrerad) "
                + "VALUES (" + IDCombobox.SelectedItem + ",  @datum, "
                + tidId + ", '"
                + Datum + "');";

            NpgsqlCommand command = new NpgsqlCommand(sql, Klubben.conn);
            
            command.Parameters.AddWithValue("@datum", this.PickDateCalendar.SelectionStart);
            
            int antalposter = command.ExecuteNonQuery();
            if (antalposter != 1) //Eventuella meddelanden vid misslyckad eller lyckad bokning
            {
                MessageBox.Show("Gick ej att boka den här tiden");
            }
            else
            {
                MessageBox.Show("Tiden är bokad");
            }
            NameCombobox.Items.Clear();
            efterNamn.Items.Clear();
            IDCombobox.Items.Clear();
            tidVal.Items.Clear();
            GetNamnFromDB();
            GetTidFromDB();
            //this.Close();
        }

        private string AddTidId() //Lägger till vald tid för bokning vid bokningsregistrering
        {
            String getTidIdSql = "SELECT tid_id FROM tid WHERE tid = @tid;";
            NpgsqlCommand command = new NpgsqlCommand(getTidIdSql, Klubben.conn);
            command.Parameters.AddWithValue("@tid", this.tidVal.SelectedItem);
            NpgsqlDataReader dr = command.ExecuteReader();
            dr.Read();
            
            String tidId = dr["tid_id"].ToString();
            
            dr.Close();
            
            return tidId;
            
        }

        private void ReggadeBoknButton_Click(object sender, EventArgs e) //Öppnar ett formulär där alla bokningar kan ses
        {
            RegistreradeBokningar NyBokningdialog = new RegistreradeBokningar(this);
            NyBokningdialog.ShowDialog();
        }

        private void AvbrytButton_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void NameCombobox_SelectedIndexChanged(object sender, EventArgs e) //Kopplar ihop efternamnbox med förnamnbox och idbox
        {
            if (this.ActiveControl != sender)
                return;
            NpgsqlCommand command = new NpgsqlCommand("SELECT golf_id, last_name, first_name FROM spelare WHERE first_name = (@firstName);", Klubben.conn);
            command.Parameters.AddWithValue("@firstName", this.NameCombobox.SelectedItem);
            NpgsqlDataReader dr = command.ExecuteReader();
            while (dr.Read())
            {
                IDCombobox.Text = (dr["golf_id"].ToString());
                efterNamn.Text = (dr["last_name"].ToString());
                NameCombobox.Text = (dr["first_name"].ToString());
            }
            dr.Close();
         }

        private void efterNamn_SelectedIndexChanged(object sender, EventArgs e) //Kopplar ihop efternamnbox med förnamnbox och idbox
        {
            if (this.ActiveControl != sender)
                return;
            NpgsqlCommand command = new NpgsqlCommand("SELECT golf_id, last_name, first_name FROM spelare WHERE last_name = (@lastName);", Klubben.conn);
            command.Parameters.AddWithValue("@lastName", this.efterNamn.SelectedItem);
            NpgsqlDataReader dr = command.ExecuteReader();
            while (dr.Read())
            {
                IDCombobox.Text = (dr["golf_id"].ToString());
                efterNamn.Text = (dr["last_name"].ToString());
                NameCombobox.Text = (dr["first_name"].ToString());
            }
            dr.Close();
        }

        private void IDCombobox_SelectedIndexChanged(object sender, EventArgs e) //Kopplar ihop efternamnbox med förnamnbox och idbox
        {
            if (this.ActiveControl != sender)
                return;
            NpgsqlCommand command = new NpgsqlCommand("SELECT golf_id, last_name, first_name FROM spelare WHERE golf_id = (@golfId);", Klubben.conn);
            command.Parameters.AddWithValue("@golfId", this.IDCombobox.SelectedItem);
            NpgsqlDataReader dr = command.ExecuteReader();
            while (dr.Read())
            {
                IDCombobox.Text = (dr["golf_id"].ToString());
                efterNamn.Text = (dr["last_name"].ToString());
                NameCombobox.Text = (dr["first_name"].ToString());
            }
            dr.Close();
        }

        public void PickDateCalendar_DateChanged(object sender, DateRangeEventArgs e) //Visar lediga tider beroende på vilket datum man markerar i kalendern och de tider som inte är bokade av banpersonal eller är fullbokade
        {
            if (this.ActiveControl != sender)
                return;
            this.tidVal.Items.Clear();
            NpgsqlCommand command = new NpgsqlCommand("SELECT tid_var.tid FROM tid tid_var WHERE(SELECT COUNT(bokning.tid_id) from bokning,tid WHERE bokning.tid_id=tid.tid_id AND tid_var.tid=tid.tid AND speldatum = @datum)<4 AND tid <> ALL (SELECT tid FROM tid, bokning WHERE bokning.tid_id = tid.tid_id AND golf_id = 16 AND speldatum = @datum) ORDER BY tid_var.tid;", Klubben.conn);
            command.Parameters.AddWithValue("@datum", this.PickDateCalendar.SelectionStart);
            command.Parameters.AddWithValue("@banarbetare", 16);
            NpgsqlDataReader dr = command.ExecuteReader();
            while (dr.Read())
            {
                tidVal.Items.Add(dr["tid"].ToString().Substring(11));
            }
            dr.Close();
        }
       
       
        
        }
}

